package lib

import (
	"bufio"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/http/httputil"
	"regexp"

	"golang.org/x/text/encoding"

	"golang.org/x/net/html/charset"

	"golang.org/x/text/encoding/simplifiedchinese"
	"golang.org/x/text/transform"
)

func GetAllUserList() {
	// 从种子页面获取数据
	res, err := http.Get("https://www.zhenai.com/zhenghun")
	if err != nil {
		panic(err)
	}

	if res.StatusCode == http.StatusOK {
		r, _ := httputil.DumpResponse(res, true)
		// 手动转码
		// doCode(r, res)
		// 自动发现网页的编码自动转
		e := autoDoCode(r, res)
		autoDoCodeBye(e, res)
	}

	defer func() {
		res.Body.Close()
	}()

}

// 处理文件的编码 需要手动支出什么编码转到utf8
func doCode(bit []byte, resp *http.Response) {
	// gbk 转 utf8
	// gopm get -g -v golang.org/x/text
	// 包的目录
	// golang.org/text/encoding/simplifiedchinese/gbk 这个gbk就可以转utf-8

	// 把一个reader变成另一个reader  text 这个 创建一个转化流  把返回流通过gbk的流转化为utf8的流
	utf8Reader := transform.NewReader(resp.Body, simplifiedchinese.GBK.NewDecoder())
	utf8, _ := ioutil.ReadAll(utf8Reader)

	fmt.Println(string(bit), string(utf8))
}

// 自动发现网页的编码自动转
// gopm get -g -v golang.org/x/net/html
func autoDoCode(bit []byte, resp *http.Response) encoding.Encoding {
	// 去猜这个Html的document encoding是什么
	// 参数1 先从流里面取1024个去猜
	// 参数2 传""
	// 返回这个猜测后的encoding
	// encoding 名字
	// 是否是这个encoding 是否确认

	// 不能直接读会影响后面的读取所以需要桥一下 Peek读多少字节
	b, _ := bufio.NewReader(resp.Body).Peek(1024)

	e, _, _ := charset.DetermineEncoding(b, "")

	return e
}

// 根据自动解析的编码来格式化
func autoDoCodeBye(e encoding.Encoding, resp *http.Response) {
	utf8Reader := transform.NewReader(resp.Body, e.NewDecoder())
	utf8, _ := ioutil.ReadAll(utf8Reader)
	// 正则表达式
	str := string(utf8)
	reg, _ := regexp.Compile(`\d+`)   // 返回值有error 需要检查正则的合法性
	reg2 := regexp.MustCompile(`\d+`) // 为什么不用 "" 用``因为需要多次转定义 返回没有error 你确认是正确的

	// 查找匹配的字符串找到就拉到了不是找所有的 参数是string 找到匹配正则的字符串 返回匹配的字符串
	fmt.Println(reg.FindString(str), reg2.FindString("1233ss11"))
	// 参数是字节
	fmt.Printf("%s-%s", reg.Find(utf8), reg2.Find([]byte("1233ss11")))

	// 如果要查询所有的有FindAll 同样 string []byte都有 参数2 我们要找多少个-1找所有的
	fmt.Println()
	fmt.Println(reg.FindAllString("1233ss11", -1))

	// 找到()里面的挖出来 匹配组 FindAllStringSubmatch 第一个匹配所有的后面是匹配到的分组 [[1233ss11 ss]] 返回二位数组 二维1 匹配的整条 后面的是捕获组的
	reg3 := regexp.MustCompile(`\d+([a-zA-Z]+)\d+`)
	fmt.Println(reg3.FindAllStringSubmatch("1233ss11", -1))

	// 获取所有的城市
	cityReg := regexp.MustCompile(`<a href="(http://www.zhenai.com/zhenghun/[0-9a-zA-Z]+)"[^>]*>([^<]+)</a>`)
	fmt.Println(cityReg.FindAllStringSubmatch(str, -1))
}
